package entity

import (
	"fmt"
	"math"
	"time"

	"gorm.io/gorm"
	"shqsoft.cn/pas3ui/base"
)

//SpBmbgCompAccoDivi 部门变更_业绩转移_对公存款认定
type SpBmbgCompAccoDivi struct {
	SPID   int       `gorm:"column:SPID;primary_key" json:"spid"`
	ACNO   string    `gorm:"column:ACNO;primary_key" json:"acno"`
	BANO   string    `gorm:"column:BANO;primary_key" json:"bano"`
	CUNM   string    `gorm:"column:CUNM" json:"cunm"`
	OPDT   time.Time `gorm:"column:OPDT" json:"opdt"`
	UTNM   string    `gorm:"column:UTNM" json:"utnm"`
	CYNM   string    `gorm:"column:CYNM" json:"cynm"`
	ITNM   string    `gorm:"column:ITNM" json:"itnm"`
	ACBL   string    `gorm:"column:ACBL" json:"acbl"`
	EMNO1  string    `gorm:"column:EMNO1" json:"emno1"`
	EMNM1  string    `gorm:"column:EMNM1" json:"emnm1"`
	DSVL1  float32   `gorm:"column:DSVL1" json:"dsvl1"`
	EMNO2  string    `gorm:"column:EMNO2" json:"emno2"`
	EMNM2  string    `gorm:"column:EMNM2" json:"emnm2"`
	DSVL2  float32   `gorm:"column:DSVL2" json:"dsvl2"`
	EMNO3  string    `gorm:"column:EMNO3" json:"emno3"`
	EMNM3  string    `gorm:"column:EMNM3" json:"emnm3"`
	DSVL3  float32   `gorm:"column:DSVL3" json:"dsvl3"`
	EMNO4  string    `gorm:"column:EMNO4" json:"emno4"`
	EMNM4  string    `gorm:"column:EMNM4" json:"emnm4"`
	DSVL4  float32   `gorm:"column:DSVL4" json:"dsvl4"`
	EMNO5  string    `gorm:"column:EMNO5" json:"emno5"`
	EMNM5  string    `gorm:"column:EMNM5" json:"emnm5"`
	DSVL5  float32   `gorm:"column:DSVL5" json:"dsvl5"`
	EMNO6  string    `gorm:"column:EMNO6" json:"emno6"`
	EMNM6  string    `gorm:"column:EMNM6" json:"emnm6"`
	DSVL6  float32   `gorm:"column:DSVL6" json:"dsvl6"`
	ACID   int       `gorm:"column:ACID" json:"acid"`
	EMID1  int       `gorm:"column:EMID1" json:"emid1"`
	EMID2  int       `gorm:"column:EMID2" json:"emid2"`
	EMID3  int       `gorm:"column:EMID3" json:"emid3"`
	EMID4  int       `gorm:"column:EMID4" json:"emid4"`
	EMID5  int       `gorm:"column:EMID5" json:"emid5"`
	EMID6  int       `gorm:"column:EMID6" json:"emid6"`
	OEMNO1 string    `gorm:"column:OEMNO1" json:"oemno1"`
	OEMNM1 string    `gorm:"column:OEMNM1" json:"oemnm1"`
	ODSVL1 float32   `gorm:"column:ODSVL1" json:"odsvl1"`
	OEMNO2 string    `gorm:"column:OEMNO2" json:"oemno2"`
	OEMNM2 string    `gorm:"column:OEMNM2" json:"oemnm2"`
	ODSVL2 float32   `gorm:"column:ODSVL2" json:"odsvl2"`
	OEMNO3 string    `gorm:"column:OEMNO3" json:"oemno3"`
	OEMNM3 string    `gorm:"column:OEMNM3" json:"oemnm3"`
	ODSVL3 float32   `gorm:"column:ODSVL3" json:"odsvl3"`
	OEMNO4 string    `gorm:"column:OEMNO4" json:"oemno4"`
	OEMNM4 string    `gorm:"column:OEMNM4" json:"oemnm4"`
	ODSVL4 float32   `gorm:"column:ODSVL4" json:"odsvl4"`
	OEMNO5 string    `gorm:"column:OEMNO5" json:"oemno5"`
	OEMNM5 string    `gorm:"column:OEMNM5" json:"oemnm5"`
	ODSVL5 float32   `gorm:"column:ODSVL5" json:"odsvl5"`
	OEMNO6 string    `gorm:"column:OEMNO6" json:"oemno6"`
	OEMNM6 string    `gorm:"column:OEMNM6" json:"oemnm6"`
	ODSVL6 float32   `gorm:"column:ODSVL6" json:"odsvl6"`
	OEMID1 int       `gorm:"column:OEMID1" json:"oemid1"`
	OEMID2 int       `gorm:"column:OEMID2" json:"oemid2"`
	OEMID3 int       `gorm:"column:OEMID3" json:"oemid3"`
	OEMID4 int       `gorm:"column:OEMID4" json:"oemid4"`
	OEMID5 int       `gorm:"column:OEMID5" json:"oemid5"`
	OEMID6 int       `gorm:"column:OEMID6" json:"oemid6"`
}

//TableName SpBmbgCompAccoDivi表名
func (SpBmbgCompAccoDivi) TableName() string {
	return "T_SP_BMBG_COMP_ACCO_DIVI"
}

//SpBmbgCompAccoDiviEF 获取实体类对象
func SpBmbgCompAccoDiviEF() base.EntityFunc {
	return func() interface{} {
		entity := SpBmbgCompAccoDivi{}
		return &entity
	}
}

//SpBmbgCompAccoDiviESF 获取实体类对象数组
func SpBmbgCompAccoDiviESF() base.EntitiesFunc {
	return func() interface{} {
		var entities []SpBmbgCompAccoDivi
		return &entities
	}
}

//BeforeSave 保存前的触发器
func (s *SpBmbgCompAccoDivi) BeforeSave(tx *gorm.DB) (err error) {
	var strSql, info string
	var acid int
	vals := make([]interface{}, 0, 2)
	strSql = "select ID from T_COMP_ACCO where ACNO=? and BANO=?"
	vals = append(vals, s.ACNO, s.BANO)
	info = fmt.Sprintf("账号:%s和子账号:%s", s.ACNO, s.BANO)
	row := base.CHDB.Raw(strSql, vals...).Row()
	err = row.Scan(&acid)
	if err != nil {
		return
	}
	if acid == 0 {
		return fmt.Errorf("%s在系统中不存在", info)
	}
	s.ACID = acid
	dsvl := s.DSVL1 + s.DSVL2 + s.DSVL3 + s.DSVL4 + s.DSVL5 + s.DSVL6
	if math.Abs(float64(dsvl-100)) > 1 {
		return fmt.Errorf("%s占比和必须为100", info)
	}
	s.EMID1, err = parseEmno(tx, s.EMNO1, s.DSVL1, 1)
	if err != nil {
		return err
	}
	s.EMID2, err = parseEmno(tx, s.EMNO2, s.DSVL2, 2)
	if err != nil {
		return err
	}
	s.EMID3, err = parseEmno(tx, s.EMNO3, s.DSVL3, 3)
	if err != nil {
		return err
	}
	s.EMID4, err = parseEmno(tx, s.EMNO4, s.DSVL4, 4)
	if err != nil {
		return err
	}
	s.EMID5, err = parseEmno(tx, s.EMNO5, s.DSVL5, 5)
	if err != nil {
		return err
	}
	s.EMID6, err = parseEmno(tx, s.EMNO6, s.DSVL6, 6)
	if err != nil {
		return err
	}
	var count int64
	tx.Table("T_SP_BMBG_COMP_ACCO_DIVI").Where(`"SPID"=? AND "ACID"=?`, s.SPID, s.ACID).Count(&count)
	if count > 0 {
		return fmt.Errorf("%s不能重复！请修改", info)
	}
	return
}

func parseEmno(tx *gorm.DB, emno string, dsvl float32, index int) (emid int, err error) {
	if emno == "" && dsvl == 0 {
		return
	}
	if emno == "" && dsvl > 0 {
		return 0, fmt.Errorf("员工号%d不能为空", index)
	}
	strSql := `select "ID" from "T_SysUser" where "SysUserID" =?`
	row := tx.Raw(strSql, emno).Row()
	err = row.Scan(&emid)
	if err != nil || emid == 0 {
		err = fmt.Errorf("员工号%s在系统中不存在", emno)
	}
	return
}

func init() {
	base.DaoPoolObj.Put("SpBmbgCompAccoDivi", base.NewDefaultDao(SpBmbgCompAccoDiviEF(), SpBmbgCompAccoDiviESF(), nil, "my"))
}
